﻿#include "Bat.h"
#include "Ball.h"
#include <sstream>
#include <cstdlib>
#include <SFML/Graphics.hpp>

int main()
{
	// 创建VideoMode对象
	VideoMode vm(1920, 1080);

	// 创建并启动游戏窗口
	RenderWindow window(vm, "Pong", Style::Fullscreen);

	int score = 0;
	int lives = 3;

	// 在屏幕底部中心创建球拍
	Bat bat(1920 / 2, 1080 - 20);

	// 添加球
	Ball ball(1920 / 2, 0);

	// 创建Text对象HUD
	Text hud;

	// 一种酷酷的复古文字
	Font font;
	font.loadFromFile("fonts/DS-DIGIT.ttf");

	// 使用此复古文字
	hud.setFont(font);
	// 调大字号
	hud.setCharacterSize(75);

	// 选定颜色
	hud.setFillColor(Color::White);
	hud.setPosition(20, 20);

	// 计时器
	Clock clock;

	while (window.isOpen())
	{
		/*
		处理玩家输入
		******************************************
		******************************************
		******************************************
		*/
		Event event;
		while (window.pollEvent(event))
		{
			if (event.type == Event::Closed)
			{
				// 当关闭窗口时退出游戏
				window.close();
			}
		}

		// 处理玩家的退出指令
		if (Keyboard::isKeyPressed(Keyboard::Escape))
		{
			window.close();
		}

		// 处理方向键操作
		if (Keyboard::isKeyPressed(Keyboard::Left))
		{
			bat.moveLeft();
		}
		else
		{
			bat.stopLeft();
		}
		if (Keyboard::isKeyPressed(Keyboard::Right))
		{
			bat.moveRight();
		}
		else
		{
			bat.stopRight();
		}

		/*
		更新球拍、球与HUD
		******************************************
		******************************************
		******************************************
		*/
		// 更新时间增量
		Time dt = clock.restart();
		bat.update(dt);
		ball.update(dt);

		// 更新HUD文本
		std::stringstream ss;
		ss << "Score:" << score << " Lives:" << lives;
		hud.setString(ss.str());

		// 更新球击穿底部的情况
		if (ball.getPosition().top > window.getSize().y)
		{
			// 反转球的方向
			ball.reboundBottom();

			// 消耗一条命
			lives--;

			// 检测是否没有血量了
			if (lives < 1)
			{
				// 重置分数
				score = 0;

				// 重置生命条数
				lives = 3;
			}
		}

		// 处理球击中顶部的情况
		if (ball.getPosition().top < 0)
		{
			ball.reboundBatOrTop();

			// 玩家赢得一分
			score++;
		}

		// 处理球击中侧边界的情况
		if (ball.getPosition().left < 0 ||
			ball.getPosition().left + ball.getPosition().width > window.getSize().x)
		{
			ball.reboundSides();
		}

		if (ball.getPosition().intersects(bat.getPosition())/* ||
			ball.getPosition().top < 0*/)
		{
			// 检测到碰撞，反转球速并得一分
			ball.reboundBatOrTop();
		}
		/*
		绘制球拍、球与HUD
		******************************************
		******************************************
		******************************************
		*/
		window.clear();
		window.draw(hud);
		window.draw(bat.getShape());
		window.draw(ball.getShape());
		window.display();
	}

	return 0;
}